/**
* @Title: DiscardServerHandler.java
* @Package com.an.discardserver
* @Description: TODO(处理服务端Chanel)
* @author antch,861710865@qq.com
* @date 2017年7月20日 上午10:48:49
* @version V1.0
*/


package com.an.discardserver;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
* @ClassName: DiscardServerHandler
* @Description: TODO(这里用一句话描述这个类的作用)
* @author antch,861710865@qq.com
* @date 2017年7月20日 上午10:48:49
*
*/
/*
 *此协议丢失任何收到的数据，而不响应。
 *
 *handler是由Netty生成，用来处理IO事件的
 */

/*
 *ChannelInboundHandlerAdapter实现了接口：：： ChannelInboundHandler，此接口
 *提供了许多事件处理的接口方法。
 */
public class DiscardServerHandler extends ChannelInboundHandlerAdapter {

	/*
	 * (非 Javadoc)
	* <p>Title: channelRead</p>
	* <p>Description: 每当从客户端收到新的数据时，这个方法会在收到消息时调用</p>
	* @param ctx
	* @param msg
	* @throws Exception
	* @see io.netty.channel.ChannelInboundHandlerAdapter#channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object)
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		// TODO 消息类型为ByteBuf。默默地丢弃收到的数据
		System.out.println("**读到数据**");

		ByteBuf in = (ByteBuf) msg;

		//读取数据法一
		/*while(in.isReadable()) {
			System.out.println((char)in.readByte());
			System.out.flush();
		}
		*/

		//读取数据法二
		//以上循环读取数据的效率底，可以简化为
		String str = in.toString(CharsetUtil.US_ASCII);

		System.out.println(str);

		//具有应答功能
		ctx.write(msg);
		ctx.flush();


		//ReferenceCountUtil.release(msg);
	}

	/*
	 * (非 Javadoc)
	* <p>Title: exceptionCaught</p>
	* <p>Description: 处理连接异常</p>
	* @param ctx
	* @param cause
	* @throws Exception
	* @see io.netty.channel.ChannelInboundHandlerAdapter#exceptionCaught(io.netty.channel.ChannelHandlerContext, java.lang.Throwable)
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		// TODO 当出现异常就关闭连接
		cause.printStackTrace();
		ctx.close();
	}
}
